fix(persona): one predicate for what a context is, and colour that says which way a copy went - #192
Merged
Merged
Conversation
…ys which way a copy went The identity map answered "is this holder known here?" three times with three different tests. The header counted contexts where a persona *wears a face*, the band drew a card for every context holding a persona *record*, and the fold counted whatever the band left over — so a live console read "known in 1 of 12" above two cards with ten folded away. One of the three numbers was lying to whoever read it, and there was no way to tell which. The state that fell between them is real. `persona/binding/list/1.0` enumerates the personas *present* in a context and carries `bound` separately, so unbinding a face leaves the persona behind: that context still knows an identifier of the holder's and can address it, while holding none of their attributes. "Known" overstates what left; "absent" hides an identifier they have out there. It now has a standing of its own and words on screen — *An identifier only*, and "This context can address that identifier. It holds nothing else of yours." - `standingOf` / `tallyContexts` in `identity-graph.ts`: known, identified, unreadable, absent, each context counted once. The header, the band and the fold all read this one predicate, and a test pins that the four sum to the total — the property the old arithmetic broke. The second half is colour, in three channels that never overlap: the border is selection and reach, the stripe and chip dots are classification, the pills are status. - Reach is painted in two hues rather than one. `reachOf` has always run asymmetrically — down from an attribute to where copies of it went, up from a context to what it holds — and a single accent hid the asymmetry it computed. Down borrows `--m-act-data` from the contexts band it ends in, up keeps the accent, and a face selection splits visibly across the dashed line. `Flow` is computed in `identity-graph.ts` with the rest of the model; the component still only draws. The key appears with the first selection and not before. - Attributes group under their claim-type family, with the family's hue repeated as a dot on every face's type chips, so a composition reads without opening it. `attribute-family.ts` classifies **only** roots the vendored registry declares: `profile.*` and `employer` resolve to *Not in the registry*, because inventing a "profile" family locally would draw a grouping nobody has agreed to in a colour that reads as though someone had checked. - The `--m-fam-*` tokens are categorical, the same species as the act colours, and `manager-theme.css`'s rule stands: `--w-ok` / `--w-warn` / `--w-danger` remain the only colours that mean anything. A test asserts no family's words claim the colour protects something — the stripe defends nothing, exactly as the mask beside it defends only a screen. - Unlit "wear" edges went neutral. Teal used to mean "a face is worn here" at rest and "this is the path you selected" when lit; one hue, two jobs. 19 new tests (328 extension, 548 core), `tsc -b` clean, `npm run build` clean with `manager.js` still a single chunk. Signed-off-by: Glenn Gore <glenn.g@affinidi.com>
stormer78
force-pushed
the
feat/persona-map-colour
branch
from
September 8, 2026 10:27
54a969d to
7f58c4f
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Rebased onto main now that #191 has merged, so this is one commit and speaks attribute throughout.
Two things the live console was getting wrong on the persona pane.
A context was denied and drawn at the same time
The map answered "is this holder known here?" with three different tests:
1 + 10 ≠ 12, and the context that fell through the crack was drawn under a band captioned where you are known while the header denied it.
The state underneath is real, and it had no words anywhere on screen.
persona/binding/list/1.0enumerates the personas present in a context and carriesboundseparately, so unbinding a face leaves the persona behind: that context still knows an identifier of the holder's and can address it, while holding none of their attributes. Calling that known overstates what left; folding it in with they hold nothing about you hides an identifier the holder has out there.standingOf/tallyContexts(identity-graph.ts) now give one predicate with four answers —known,identified,unreadable,absent— and the header, the band and the fold all read it. A test pins that the four sum to the total. The card keeps its place under its own heading:Colour, in three channels that never overlap
Border = selection and reach. Stripe and chip dots = classification. Pills = status.
reachOfhas always run asymmetrically — down from an attribute to where copies of it went, up from a context to what it holds — and one accent hid the asymmetry it was computing. Down borrows--m-act-datafrom the contexts band it ends in; up keeps the accent; a face selection splits visibly across the dashed line, which is the model the pane exists to teach.Flowis computed inidentity-graph.tswith the rest of the model — the component still only draws. The key appears with the first selection and not before.attribute-family.tsclassifies only roots the vendored registry declares —profile.*andemployerland in Not in the registry, because inventing a "profile" family here would draw a grouping nobody has agreed to, in a colour that reads as though someone had checked.--m-fam-*are categorical, the same species as the act colours;--w-ok/--w-warn/--w-dangerremain the only colours that mean anything. A test asserts no family's words claim the colour protects something: the stripe defends nothing, exactly as the mask beside it defends only a screen.Checks
tsc -bclean across workspaces;npm run buildclean,manager.jsstill a single chunk anddist/background.jsunchanged.Not in this PR
CLAUDE.md's vocabulary paragraph still says the on-screen word is fact — docs(persona): the on-screen word for an attribute is "attribute", not "fact" #191 changed the code and the guard but not that paragraph.claim-sensitivity.tshas "deliberately no prefix walk". It has one now (trust-tasks#377, tightening-only), so the note reads backwards.